package me.yushuai.wukong.base.api;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.yushuai.wukong.base.api.dto.*;
import me.yushuai.wukong.base.api.vo.ConfGroupVO;
import me.yushuai.wukong.base.api.vo.ConfVO;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.exceptin.DuplicateBizIdException;
import me.yushuai.wukong.common.exceptin.NotExistException;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotNull;

/**
 * 配置项管理客户端
 *
 * @author zhoushuai@189.cn
 * @since 2022-09-13
 */
@Component
@Api("配置项API")
@FeignClient("${spring.application.name}")
public interface ConfApi {

    /**
     * 新建一条配置项记录
     *
     * @param groupId 配置项编号
     * @param dto     新建配置项信息
     * @return 返回配置项的编号
     * @throws DuplicateBizIdException 当配置项编码已经存在时抛出异常
     * @throws NotExistException       当配置组不存在时抛出异常
     */
    @ApiOperation("新建配置项")
    @PostMapping("/conf/{confId}/item")
    Long createConf(@PathVariable("confId") @NotNull Long groupId, @Validated @RequestBody CreateConfDTO dto)
            throws DuplicateBizIdException, NotExistException;

    /**
     * 修改配置项信息
     *
     * @param groupId           配置编号
     * @param confId            配置项编号
     * @param updateConfItemDTO 配置项信息
     * @return 返回被修改的配置项编号
     * @throws NotExistException 当配置项编号不存在时抛出异常
     */
    @ApiOperation("修改配置项")
    @PutMapping("/conf/{groupId}/item/{confId}")
    Long editConf(
            @PathVariable("groupId") @NotNull Long groupId,
            @PathVariable("confId") @NotNull Long confId,
            @Validated @RequestBody UpdateConfValueDTO updateConfItemDTO
    ) throws NotExistException;

    /**
     * 删除一条配置项信息
     *
     * @param groupId 配置编号
     * @param confId  配置项编号
     * @return 返回配置项的编号
     * @throws NotExistException 当配置项不存在时抛出异常
     */
    @ApiOperation("删除配置项")
    @DeleteMapping("/conf/{groupId}/item/{confId}")
    Long deleteConf(
            @PathVariable("groupId") @NotNull Long groupId,
            @PathVariable("confId") @NotNull Long confId
    ) throws NotExistException;

    /**
     * 获取配置项详细信息
     *
     * @param groupId 配置编号
     * @param confId  配置项编号
     * @return 返回配置项详细信息
     * @throws NotExistException 当配置项信息不存在时抛出异常
     */
    @ApiOperation("配置项详细信息")
    @GetMapping("/conf/{groupId}/item/{confId}")
    ConfVO getConfGroupById(
            @PathVariable("groupId") @NotNull Long groupId,
            @PathVariable("confId") @NotNull Long confId
    ) throws NotExistException;


    /**
     * 分页条件检索配置项信息
     *
     * @param groupId      配置项编号
     * @param pagingSearch 分页检索条件
     * @return 分页返回检索结果
     */
    @ApiOperation("分页条件检索海关编码信息")
    @PostMapping("/conf/{groupId}/item-list")
    PageDTO<ConfVO> pagingSearchConf(@PathVariable("groupId") Long groupId,
                                     @Validated @RequestBody PagingSearchConf pagingSearch);

    /**
     * 新建一条系统配置记录
     *
     * @param dto 新建系统配置信息
     * @return 返回系统配置的编号
     * @throws DuplicateBizIdException 当系统配置编码已经存在时抛出异常
     */
    @ApiOperation("新建系统配置")
    @PostMapping("/conf")
    Long createConfGroup(@Validated @RequestBody CreateConfGroupDTO dto) throws DuplicateBizIdException;

    /**
     * 修改系统配置信息
     *
     * @param groupId 系统配置编号
     * @param dto     系统配置信息
     * @return 返回被修改的系统配置编号
     * @throws NotExistException 当系统配置编号不存在时抛出异常
     */
    @ApiOperation("修改系统配置")
    @PutMapping("/conf/{groupId}")
    Long editConfGroup(@PathVariable("groupId") Long groupId, @Validated @RequestBody UpdateConfGroupDTO dto)
            throws NotExistException;

    /**
     * 删除一条系统配置信息
     *
     * @param groupId 系统配置编号
     * @return 返回系统配置的编号
     * @throws NotExistException 当系统配置不存在时抛出异常
     */
    @ApiOperation("删除系统配置")
    @DeleteMapping("/conf/{groupId}")
    Long deleteConfGroup(@PathVariable("groupId") Long groupId) throws NotExistException;

    /**
     * 获取系统配置详细信息
     *
     * @param groupId 系统配置编号
     * @return 返回系统配置详细信息
     * @throws NotExistException 当系统配置信息不存在时抛出异常
     */
    @ApiOperation("系统配置详细信息")
    @GetMapping("/conf/{groupId}")
    ConfGroupVO getConfGroupById(@PathVariable("groupId") Long groupId) throws NotExistException;


    /**
     * 分页条件检索系统配置信息
     *
     * @param pagingSearch 分页检索条件
     * @return 分页返回检索结果
     */
    @ApiOperation("分页条件检索海关编码信息")
    @PostMapping("/conf-list")
    PageDTO<ConfGroupVO> pagingSearchConfGroup(@Validated @RequestBody PagingSearchConfGroup pagingSearch);


    /**
     * 检查配置是否存在
     *
     * @param customerTypeConfId
     * @param customerTypeId
     * @return
     */
    @GetMapping(value = "/conf/{conf}", params = "action=exist")
    boolean existsByConfId(@PathVariable("conf") Long customerTypeConfId, Long customerTypeId);
}
